package org.iamd.web.mbeans.common;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;

import javax.el.MethodExpression;
import javax.faces.application.Application;
import javax.faces.component.html.HtmlPanelGrid;
import javax.faces.context.FacesContext;

import org.ajax4jsf.component.UIActionParameter;
import org.ajax4jsf.component.html.HtmlAjaxCommandLink;
import org.iamd.web.ui.generator.UIGenerator;
import org.iamd.web.util.ManagedBeans;

/**
 * Генерира динамично language toolbar-а, с поддържаните езици като ги изчита от
 * <b> faces-config.xml </b>.
 * 
 * @author Mim
 */
public class MBLocale {

	/**
	 * Списък с поддържаните езици
	 */
	private List<Locale> supportedLocales;

	/**
	 * Текущо избран език
	 */
	private String selectedLocaleAbbr;

	/**
	 * Панел с поддържаните езици
	 */
	private HtmlPanelGrid localeGrid;

	/**
	 * Идентификатор на външен панел
	 */
	private static final String MAIN_PANEL_ID = "outerPanel";

	/**
	 * Конструктор
	 */
	public MBLocale() {
		super();
		initLocales();
		generateLocaleGrid();
	}

	/**
	 * Зарежда списъка с поддържани езици, като този който е посочен по
	 * подразбиране, се посочва за текущ
	 */
	private void initLocales() {
		Application app = FacesContext.getCurrentInstance().getApplication();
		Locale defaultLocale = app.getDefaultLocale();
		FacesContext.getCurrentInstance().getViewRoot().setLocale(defaultLocale);
		this.selectedLocaleAbbr = defaultLocale.getISO3Language();
		this.supportedLocales = new ArrayList<Locale>();
		Iterator<Locale> supportedLocalesIt = app.getSupportedLocales();
		while (supportedLocalesIt.hasNext()) {
			this.supportedLocales.add(supportedLocalesIt.next());
		}
	}

	/**
	 * Промяна на език
	 */
	public void changeLocale() {
		for (Locale curr : this.supportedLocales) {
			if (curr.getISO3Language().equalsIgnoreCase(this.selectedLocaleAbbr)) {
				FacesContext.getCurrentInstance().getViewRoot().setLocale(curr);
				break;
			}
		}
	}

	/**
	 * Връща ключ на избраният език
	 */
	public String getSelectedLocaleAbbr() {
		return selectedLocaleAbbr;
	}

	/**
	 * Задава текущ език
	 * 
	 * @param selectedLocaleAbbr
	 *            избран език
	 */
	public void setSelectedLocaleAbbr(String selectedLocaleAbbr) {
		this.selectedLocaleAbbr = selectedLocaleAbbr;
	}

	/**
	 * Динамично генерира т.н. "language toolbar"
	 */
	public void generateLocaleGrid() {
		UIGenerator helper = new UIGenerator();
		this.localeGrid = helper.genHPanelGrid("locale");
		HtmlAjaxCommandLink currLocaleLink = null;
		MethodExpression methodExpr = null;
		UIActionParameter actionParam = null;
		String isoLngAbbrev = null;
		if (!this.supportedLocales.isEmpty()) {
			this.localeGrid.setColumns(this.supportedLocales.size());
			methodExpr = helper.getMethodExpression("changeLocale", getCurrentBean());
			for (Locale curr : this.supportedLocales) {
				isoLngAbbrev = curr.getISO3Language();
				actionParam = helper.getUIActionParameter(isoLngAbbrev, isoLngAbbrev, isoLngAbbrev,
						"selectedLocaleAbbr", getCurrentBean(), null);
				currLocaleLink = helper.getA4JCommandLInk(isoLngAbbrev, isoLngAbbrev.toUpperCase(),
						curr.getDisplayLanguage().toUpperCase(), this.localeGrid, methodExpr,
						actionParam, null, null, MAIN_PANEL_ID);
				actionParam.setParent(currLocaleLink);
				currLocaleLink.getChildren().add(actionParam);
				this.localeGrid.getChildren().add(currLocaleLink);
			}
		}
	}

	/**
	 * Връща описанието на текущия MB
	 * @see org.iamd.web.util.ManagedBeans#locale
	 */
	public ManagedBeans getCurrentBean() {
		return ManagedBeans.locale;
	}

	/**
	 * Връща т.н. "language toolbar"
	 */
	public HtmlPanelGrid getLocaleGrid() {
		return localeGrid;
	}

	/**
	 * Задава т.н. "language toolbar"
	 * 
	 * @param localeGrid
	 *            language toolbar
	 */
	public void setLocaleGrid(HtmlPanelGrid localeGrid) {
		this.localeGrid = localeGrid;
	}
}
